#挑选出想要分析的统计量
mt <- mtcars[c("mpg", "hp", "wt", "am")]
head(mt)

#第一种计算描述性统计量的方法:summary()
#summary会产生很多结果
mt <- mtcars[c("mpg", "hp", "wt", "am")]
summary(mt)


#sapply用于计算出选择的描述性统计量
mystats <- function(x, na.omit=FALSE){
  if (na.omit)
    x <- x[!is.na(x)]
  m <- mean(x)
  n <- length(x)
  s <- sd(x)
  skew <- sum((x-m)^3/s^3)/n
  kurt <- sum((x-m)^4/s^4)/n - 3
  return(c(n=n, mean=m, stdev=s, skew=skew, kurtosis=kurt))
}

myvars <- c("mpg", "hp", "wt")
sapply(mtcars[myvars], mystats)


#第二种方法：Hmisc库中的describe()函数
library(Hmisc)
myvars <- c("mpg", "hp", "wt")
describe(mtcars[myvars])


#第三种方法：pastecs包中的stat.desc()函数
library(pastecs)
myvars <- c("mpg", "hp", "wt")
stat.desc(mtcars[myvars])


#第四种方法：psych包中的describe()函数
library(psych)
myvars <- c("mpg", "hp", "wt")
describe(mtcars[myvars])


#分组计算描述性统计量
myvars <- c("mpg", "hp", "wt")
aggregate(mtcars[myvars], by=list(am=mtcars$am), mean)
aggregate(mtcars[myvars], by=list(am=mtcars$am), sd)


#由于aggregate无法一次返回若干个统计量，但by函数可以做到
dstats <- function(x)sapply(x, mystats)
myvars <- c("mpg", "hp", "wt")
by(mtcars[myvars], mtcars$am, dstats)


#另外的分组计算方法一:doBy包的summaryBy()函数
library(doBy)
summaryBy(mpg+hp+wt~am, data=mtcars, FUN=mystats)


#另外的分组计算方法二:psych包的describeBy()函数
library(psych)
myvars <- c("mpg", "hp", "wt")
describeBy(mtcars[myvars], list(am=mtcars$am))
